home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
llp
/
pass.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-17
|
6KB
|
197 lines
//---------------------------------------------------------------------------
// PASSWORD (c) Laurence Vanhelsuwe 1994
// --------
// This program is part of a group of 3 complimentary programs to log the
// usage of a stand-alone machine. (LOGIN, LOGOUT, PASSWORD)
//
// This program has been written in ANSI C to make it fully portable across
// different hardware platforms.
//
// Original development and testing was carried out on a Commodore Amiga 3000.
//
// History
// -------
// 03-JAN-94: Initial file creation.
// 06-JAN-94: First useful version (with encoding)
// 11-FEB-94: Fixed users listing bug ( "\r" ending prevented correct listing)
//---------------------------------------------------------------------------
//#define DEBUG 1
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "fcntl.h"
#include "time.h"
#define MAX_NAME_LEN (10)
#define ENTRY_LEN (1+ MAX_NAME_LEN*2)
#define SET_FG_0 "
"
#ifdef AMIGA
#define PFILE "DEVS:PASSWORDS.DAT"
#define HELP "?"
#define SET_FG_1 "
"
#define CREAT_MODE (O_RDWR)
#define OPEN_MODE (O_RDWR)
#else
#include "sys\stat.h"
#define PFILE "C:/DOS/PASSWOR.DAT"
#define HELP "/?"
#define SET_FG_1 "
"
#define CREAT_MODE (S_IREAD | S_IWRITE)
#define OPEN_MODE (O_RDWR | O_BINARY)
#endif
//---------------------------------------------------------------------------
// Function Prototypes
// -------------------
//---------------------------------------------------------------------------
void get_password (char *prompt_str, char *passw_str);
//---------------------------------------------------------------------------
// Globals
// -------
//---------------------------------------------------------------------------
char sysop_password[40];
char input[80];
char username[MAX_NAME_LEN+2];
char userpasw[MAX_NAME_LEN+2];
long int file_size, log_pos;
int error, num_entries;
extern int errno;
int logfile, passwfile; // LEVEL 1 ANSI C File Handles
time_t systime;
struct tm *tim;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
main(int argc, char **argv) {
int i,j,len, namelen, passwlen, num;
char *s,*d;
if(argc > 1 ) {
printf("PASSWORD V1.0 (Copyright (c) Jan 1994 L. Vanhelsuwe)\n\n");
printf("Programmed by Laurence Vanhelsuwe in C on an Amiga 3000.\n");
printf("Ported to IBM PC environment by L. Vanhelsuwe.\n\n");
printf("USAGE: PASSWORD [%s]\n\n", HELP);
}
if ((passwfile = open(PFILE, OPEN_MODE)) == -1) {
#ifdef DEBUG
printf("open(\"%s\",OPEN_MODE) returned %d...\n", PFILE, passwfile);
printf("ERROR # : %d \n", errno);
#endif
printf("Passwords file does not exist ! Attempting to create it...\n");
passwfile = creat(PFILE, CREAT_MODE);
if (passwfile == -1) {
fprintf(stderr, "Couldn't create passwords file! Aborting...\n");
exit(10);
}
printf("Passwords file created OK.\n");
}
get_password("Enter System Operator Password:", sysop_password);
// If the SYSOP enters the right PASSWORD immediately followed by 'USERS',
// The programs dumps a list of all the valid users (decoded).
if(strcmp(sysop_password, "AGRCRGAUSERS") == 0) {
printf("\nAuthorized Users List:\n\n");
printf ("NUMBER\tUSERNAME PASSWORD\n");
printf ("------\t-------- --------\n");
i = read(passwfile, input, ENTRY_LEN);
num = 1;
while (i==ENTRY_LEN) {
for(j=0;j<MAX_NAME_LEN;j++)
if (input[j] != ' ') input[j]=input[j]-1; // decode name
for(j=MAX_NAME_LEN;j<2*MAX_NAME_LEN;j++)
if (input[j] != ' ') input[j]=input[j]-2; // decode password
printf("%3d\t", num++);
printf(input); // print both
printf("\n");
i = read(passwfile, input, ENTRY_LEN);
}
printf("\n");
close(passwfile);
return 0;
}
// If the password wasn't the special listing password, then you have to enter
// the normal one or you're out !
if(strcmp(sysop_password, "AGRCRGA") != 0) {
printf("\nYou are not authorized to add users to this system.\n");
exit(20);
}
lseek(passwfile, 0L, SEEK_END); // goto the end to APPEND
do {
printf("Enter new User's NAME :");
scanf("%s", input);
namelen = strlen(input);
if (namelen > MAX_NAME_LEN)
printf("Please enter upto %d characters maximum..\n", MAX_NAME_LEN);
} while (namelen > MAX_NAME_LEN);
strcpy(username, input);
do {
get_password("Enter new User's PASSWORD :", input);
passwlen = strlen(input);
if (passwlen > MAX_NAME_LEN)
printf("Please enter upto %d characters maximum..\n", MAX_NAME_LEN);
if (passwlen < 4)
printf("Please enter at least 4 characters..\n");
} while (passwlen > MAX_NAME_LEN || passwlen < 4);
strcpy(userpasw, input);
for(i=0, s=d=username; i<namelen ; i++) *d++ = (*s++) +1;
write(passwfile, username, namelen);
len = MAX_NAME_LEN - namelen;
if (len) write(passwfile, " ", len);
for(i=0, s=d=userpasw; i<passwlen; i++) *d++ = (*s++) +2;
write(passwfile, userpasw, passwlen);
len = MAX_NAME_LEN - passwlen;
if (len) write(passwfile, " ", len);
write(passwfile, "\r", 1);
for(i=0, s=d=username; i<namelen ; i++) *d++ = (*s++) -1;
printf("\nUser '%s' added to list of Authorized Users\n", username);
close(passwfile);
return 0;
}
//---------------------------------------------------------------------------
// Get an invisible string in an ANSI compatible, portable way.
//---------------------------------------------------------------------------
void get_password (char *prompt_str, char *passw_str) {
printf(prompt_str); // print the prompt
printf(SET_FG_0); // switch to WHITE foreground
scanf("%s", passw_str); // get the string (cursor still moves...)
printf(SET_FG_1); // switch back to normal foreground color
}
//---------------------------------------------------------------------------